package br.edu.ufabc.lnc.peanho.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Transparency;

import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class ImageUtilities {

	private static GraphicsConfiguration gc;
	static {
		GraphicsEnvironment ge = GraphicsEnvironment
				.getLocalGraphicsEnvironment();
		GraphicsDevice gd = ge.getDefaultScreenDevice();
		gc = gd.getDefaultConfiguration();
	}

	/**
	 * Retorna uma {@link BufferedImage} compatível com o espaço de cor e
	 * organização de dados do dispositivo de saída padrão.
	 * 
	 * @param filename
	 *            nome do arquivo de imagem a ser carregado
	 * @return {@code BufferedImage} ou null
	 */
	public static BufferedImage loadImage(String filename) {
		try {
			ClassLoader classLoader = ImageUtilities.class.getClassLoader();
			URL url = classLoader.getResource(filename);
			BufferedImage bi = ImageIO.read(url);
			int transparency = bi.getTransparency();
			BufferedImage compatibleImage = gc.createCompatibleImage(bi
					.getWidth(), bi.getHeight(), transparency);
			Graphics2D g2d = compatibleImage.createGraphics();
			g2d.drawImage(bi, 0, 0, null);
			g2d.dispose();
			return compatibleImage;
		} catch (IOException ioException) {
			// XXX debug
			ioException.printStackTrace();
			return null;
		}
	}

	/**
	 * Retorna uma imagem compatível com o dispositivo de saída, com cor {@code
	 * color}.
	 * 
	 * @param width
	 *            largura da imagem
	 * @param height
	 *            altura da imagem
	 * @param transparency
	 *            int indicando a transparência da imagem. Um dos valores:
	 *            {@link Transparency#BITMASK}, {@link Transparency#OPAQUE} ou
	 *            {@link Transparency#TRANSLUCENT}
	 * @param color
	 *            cor da imagem
	 * @return {@code BufferedImage} com o mesmo modelo de cor e layout de dados
	 *         da tela e cor uniforme {@code color}
	 */
	public static BufferedImage createCompatibleImage(int width, int height,
			int transparency, Color color) {
		BufferedImage compatibleImage = gc.createCompatibleImage(width, height,
				transparency);
		if (color != null) {
			Graphics2D g2d = compatibleImage.createGraphics();
			g2d.fill(new Rectangle2D.Float(0, 0, width, height));
			g2d.dispose();
		}
		return compatibleImage;
	}
}
